#include "ply.h"


modelspace::Matrix_4_4::Matrix_4_4()
{
}


modelspace::Matrix_4_4::Matrix_4_4(float *p)
{
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        {
            value[i][j]=*(p+i*4+j);
            //value[j][i]=*(p+i*4+j);
        }
}

void modelspace::Matrix_4_4::read(float *p)
{
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        {
            value[i][j]=*(p+i*4+j);
            //value[j][i]=*(p+i*4+j);
        }

}



modelspace::ObjMatrix::ObjMatrix(int objNum, int frameNum, float *pMatrix){
   // try{
        if(objNum&&frameNum)
        {
            this->objNum=objNum;
            this->frameNum=frameNum;
            this->frame=new Matrix_4_4[objNum*frameNum];

            for(int i=0;i<frameNum;i++)
                for(int j=0;j<objNum;j++)
                {
                    frame[i*objNum+j].read(pMatrix+16*(i*objNum+j));
                }



            point=new mpoint*[frameNum];

        }
   // }catch(){}

}

int modelspace::ObjMatrix::calculateFrame(mpoint *p, int pointNum, plyobject *pobj)
{
    for(int i=0;i<frameNum;i++)
    {
        point[i]=new mpoint[pointNum];
    }



    float x,y,z;
    for(int i=0;i<frameNum;i++)
    {



        for(int j=0;j<objNum;j++)
        {

            for(int ii=pobj[j].pbegin;ii<pobj[j].pend;ii++)
            {
                x=p[ii].x;
                y=p[ii].y;
                z=p[ii].z;
                point[i][ii].U=p[ii].U;
                point[i][ii].V=p[ii].V;



                point[i][ii].x=getMatrix(i,j)->value[0][0]*x+getMatrix(i,j)->value[0][1]*y+getMatrix(i,j)->value[0][2]*z+getMatrix(i,j)->value[0][3]*1;
                point[i][ii].y=getMatrix(i,j)->value[1][0]*x+getMatrix(i,j)->value[1][1]*y+getMatrix(i,j)->value[1][2]*z+getMatrix(i,j)->value[1][3]*1;
                point[i][ii].z=getMatrix(i,j)->value[2][0]*x+getMatrix(i,j)->value[2][1]*y+getMatrix(i,j)->value[2][2]*z+getMatrix(i,j)->value[2][3]*1;


            }

        }


    }

    return 0;
}


modelspace::mpoint * modelspace::ObjMatrix::getFramePPoint(int frameIndex)
{
    if(this->point!=NULL)
        return point[frameIndex];
    return NULL ;
}

modelspace::ObjMatrix::~ObjMatrix(){
    delete []frame;
    for(int i=0;i<frameNum;i++)
    {
        delete []point[i];
    }
    delete []point;

}

modelspace::Matrix_4_4 * modelspace::ObjMatrix::getMatrix(int frameIndex,int objIndex)
{
    if(frameIndex>=0&&objIndex>=0&&frameIndex<frameNum&&objIndex<objNum)
        return frame+frameIndex*objNum+objIndex;
    else
        return NULL;
}
